Le CAES du CNRS nous accueille !
Sciences de l’information géographique reproductibles.27 juin - 3 juillet 2021 Saint-Pierre d’Oléron (France)
L’objet de cette mise en application consiste à qualifier l’environnement géographique des villages du Comité d’Action et d’Entraide Sociales (CAES) du CNRS.
Trois libraires sont ici mobilisées pour exécuter l’analyse.
library(sf) # Manipulation de données spatiales
library(mapsf) # Représentations cartographiques
library(potential) # Calcul de potentielLes villages CAES du CNRS
Il existe cinq villages CNRS en France. Ils ont été préalablement localisés (latitude / longitude) dans un fichier .csv. Cela permet leur géoréférencement, puis de produire une première carte de localisation.
Pour les réalisations cartographiques, le package mapsf dédié à la cartographie thématique sera utilisé. Ce package permet notamment d’utiliser des thèmes graphiques, comme nevermind.
# Géolocalisation des centres
cent <- read.csv(file = "data/cnrs.csv")
cnrs <- st_as_sf(cent, coords = c("longitude", "latitude"), crs = 4326)
cnrs <- st_transform(cnrs, 2154)
# France
fr <- st_read(dsn = "data/fr.gpkg", layer = "fr", quiet = TRUE)
# Et cartographie
mf_theme("nevermind")
mf_map(fr, border = NA)
mf_map(cnrs, bg = "red", pch = 21, cex = 2, add = T)
mf_label(x = cnrs, var = "lieu", halo = TRUE, pos = 1,
overlap = FALSE, lines = FALSE, bg = "white", cex = 1)
mf_layout(title = "Les villages du CNRS",
credits = "Ecole Thématique SIG-R, RIATE, 2021", arrow = FALSE)Focus sur Oléron
Qu’est-ce qui caractérise les environs géographiques de la Vieille Pérrotine qui nous accueille aujourd’hui ? C’est ce que nous proposons d’explorer ici avec trois visualisations cartographiques.
Import des données
Tous les jeux de données suivent la même structure. Il suffit de modifier le nom du centre (oleron, aussois, frejus, gerberal ou plantiers) pour modifier l’espace d’étude.
centre <- "oleron"
# Couches disponibles
st_layers(paste0("data/", centre, ".gpkg"))Driver: GPKG
Available layers:
layer_name geometry_type features fields
1 cnrs Point 1 3
2 cnrsBuf Polygon 1 3
3 com 84 3
4 country Multi Polygon 1 5
5 grid Polygon 2943 4
6 osm Point 1090 6
Pour chaque village CAES du CNRS, et dans un périmètre de 30 km, les couches géographiques utiles à l’analyse sont stockées sous forme de geopackage :
- cnrs : localisation du centre CNRS (couche point).
- cnrsBuf : Périmètre de 30 km autour du centre CNRS (polygone).
- com : Municipalités intersectant le périmètre de 30 km autour du centre CNRS. La population municipale 2019 est un attribut de cette couche (polygones).
- country : couche pays intersctant le périmètre de 30 km, potentiellement utile pour les représentations associées au centres frontaliers comme Aussois (polygones).
- grid : grille de résolution de 1000m intersectant le périmètre de 30km autour du centre CNRS. La valeur de pollution lumineuse (radiance) a pour unité de mesure le nano Watt par cm² (couche polygones).
- osm : Localisation des points d’intérêts touristiques intersectant le périmètre d’étude (tourism = museum, viewpoint et artwork + historic = fort et monument dans OpenStreetMap) (couche point).
Ces couches géographiques sont chargées depuis le répertoire data. La projection utilisée est celle de référence pour la France métropolitaine (EPSG 2154).
# Import des couches
cnrs <- st_read(dsn = paste0("data/", centre, ".gpkg"), layer = "cnrs",
quiet = TRUE)
buf <- st_read(dsn = paste0("data/", centre, ".gpkg"), layer = "cnrsBuf",
quiet = TRUE)
com <- st_read(dsn = paste0("data/", centre, ".gpkg"), layer = "com",
quiet = TRUE)
country <- st_read(dsn = paste0("data/", centre, ".gpkg"), layer = "country",
quiet = TRUE)
grid <- st_read(dsn = paste0("data/", centre, ".gpkg"), layer = "grid",
quiet = TRUE)
osm <- st_read(dsn = paste0("data/", centre, ".gpkg"), layer = "osm",
quiet = TRUE)Un petit coin paumé ?
Nous cherchons ici à évaluer la population résidente à moins de 30 km du centre CNRS. La carte en figuré proportionnels est réalisée avec la fonction mf_map(type = prop) Les labels des cinq communes les plus peuplées sont représentées. Le titre de la carte (mf_layout) restitue la population la population totale dans un rayon de 30 km autour du centre.
# Ordonner les communes selon leur population (décroissant)
com <- com[order(com$POP_2019, decreasing = TRUE),]
# Carte principale
mf_theme("nevermind") # Un thème
mf_map(buf, col = "lightblue", border = NA) # Périmètre d'analyse
mf_map(com, col = "white", add = TRUE) # Afficher les communes
mf_map(com, type = "prop", var = "POP_2019", leg_pos = "topleft",
col = "grey34", border = "white",
leg_title = "Population 2019") # Population des communes
mf_map(cnrs, pch = 17, col = "darkred", cex = 2,
add = TRUE) # Localisation centre de vacances
mf_label(x = cnrs, var = "centre", halo = TRUE, cex = 0.9, pos = 1,
overlap = FALSE, bg = "white", lines = FALSE,
r = 0.15) # Afficher son nom
mf_label(x = com[1:5,], var = "LAU_NAME", halo = TRUE, cex = 0.8, overlap = FALSE,
lines = FALSE, bg = "white") # Label des 5 communes les plus peuplées
mf_map(buf, col = NA, lwd = 2, add = TRUE) # Périmètre d'analyse
# Carton de localisation
mf_inset_on(fr, pos = "topright", cex = 0.2)
mf_map(fr, border = NA)
mf_map(fr, col = "white", border = NA, add = TRUE)
mf_map(cnrs, pch = 17, col = "darkred", cex = 2, add = TRUE)
box(col = "white")
mf_inset_off()
# Habillage
mf_layout(title = paste0(round(sum(com$POP_2019),-2),
" habitants dans les bourgs des environs"),
credits = paste0("Ecole Thématique SIG-R, RIATE, 2021\n",
"Source : Eurostat - GISCO, 2021"),
arrow = FALSE)Sympa pour voir les étoiles ?
On cherche ici à évaluer l’intensité de la pollution lumineuse sur l’espace d’étude, exprimée en nano Watt par cm². Une carte choroplète (mf_map, type = choro) permet de visualiser les résultats. Pour enrichir la carte, la valeur maximale observée est représentée et un histogramme présentant la répartition des valeurs sur l’espace d’étude est associé.
Le titre de la carte est contextualisé (association du nom de l’espace d’étude et la moyenne des valeurs de radiance observées).
# Discrétisation et palette de couleur
brks <- c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 1, 1.5, 2,
max(grid$World_Atlas_2015, na.rm = TRUE))
pal <- hcl.colors(n = 9, palette = "Lajolla", rev = TRUE)
# Cartographie
mf_map(buf, col = "lightblue", border = NA)
mf_map(grid, var = "World_Atlas_2015", type = "choro", breaks = brks,
border = NA, pal = pal, leg_pos = "topleft",
leg_title = "Pollution lumineuse en 2015\n(Radiance en nano W/cm²)",
add = TRUE, leg_no_data = "Valeur maximale")
mf_map(grid[which.max(grid$World_Atlas_2015),], col = NA, add = TRUE) # Max
mf_map(country, border = "white", col = NA, add = TRUE) # Front de mer
mf_map(cnrs, add = TRUE, pch = 17, cex = 2, col = "#ffffff90")
mf_map(buf, col = NA, lwd = 2, add = TRUE) # Périmètre d'analyse
# Histogramme (inset)
mf_inset_on(fig = c(0.75, .99, 0.75, 1))
par(mar = c(0,0,1.7,0))
hist(grid$World_Atlas_2015, breaks = brks, col = pal, border = "white", axes = F,
labels = "", xlab="", ylab = "", main ="")
axis(side = 1, at = round(brks, 2), las = 2, tick = FALSE, line = -.9,
cex.axis = .7, col.axis = "white")
title("Histogramme de répartition", cex.main = .8, col.main = "white",
font.main = 1, adj = 0)
mf_inset_off()
# Mise en page
mf_layout(title = paste0("Voir les étoiles à ", cnrs$lieu, " (Moyenne = ",
round(mean(grid$World_Atlas_2015, na.rm = TRUE), 2), ")"),
credits = paste0("Ecole Thématique SIG-R, RIATE, 2021\n",
"Source : Falchi et al., Supplement to the New World",
"Atlas of Artificial Night Sky Brightness. GFZ Data Services"),
arrow = FALSE)Une virée touristique ?
Qu’est-ce qu’il y a à voir ?
On s’intéresse ici à la localisation des points d’intérêt touristique sur l’espace d’étude. Une carte de typologie (mf_map, type =typo`) est réalisée où une couleur est affectée à un type d’équipement (clé-valeur OSM). A la représentation cartographique est associée un graphique en barres qui dénombre les équipements par type (les valeurs sont ordonnées par ordre décroissant).
# Dénombrement des équipements
eqSum <- sort(table(osm$value), decreasing = TRUE)
# Gestion des couleurs
cols <- data.frame(pal = c("#f2b200", "#f26500", "#524b46", "#783c00", "#009921"),
val = c("museum", "artwork", "monument", "fort", "viewpoint"))
cols <- cols[match(names(eqSum), cols$val),]
# Cartographie
mf_map(buf, col = "lightblue", border = NA)
mf_map(country, col = "white", border = NA, add = TRUE)
mf_map(x = osm, var = "value", type = "typo", cex = 0.7, border = NA, pch = 18,
pal = cols$pal, val_order = cols$val,
leg_pos = "topleft", leg_title = "Points d'intérêt", add = TRUE)
mf_map(cnrs, add = TRUE, pch = 24, cex = 2, col = "black", bg = NA)
mf_map(buf, col = NA, lwd = 2, add = TRUE) # Périmètre d'analyse
# Barplot (inset)
mf_inset_on(fig = c(0.77, .99, 0.75, 1))
par(mar = c(0,0,1.7,0))
x <- barplot(eqSum, col = cols$pal, border = "white", axes = FALSE, axisnames = FALSE)
axis(side = 1, at = x, labels = cols$val, tick = FALSE, line = -.9,
cex.axis = .5, col.axis = "white")
axis(side = 2, at = seq(0,round(max(eqSum), -2),100), las = 2,
col.axis = "white", tick = FALSE, cex.axis = 0.6)
title("Dénombrement des points d'intérêts", cex.main = .8, col.main = "white",
font.main = 1, adj = 0)
mf_inset_off()
# Mise en page
mf_layout(title = paste0(nrow(osm), " points d'intérêt autour de ", cnrs$lieu),
credits = paste0("Ecole Thématique SIG-R, RIATE, 2021\n",
"Source : OpenStreetMap et Contributeurs, 2021"),
arrow = FALSE)Mais où concentrer ses efforts ?
La librairie potential permet de visualiser la concentration d’équipements dans un voisinage géographique. Les étapes successives consistent à créer une grille régulière (1000 m), dénombrer le nombre d’équipements (fonction mcpotential dans un voisinage géographique donné suivant une fonction d’interaction spatiale (2500 m ici, fonction exponentielle décroissante) puis créer des isolignes d’égale valeur.
Pour en savoir plus sur la méthode, se reporter à la documentation du package.
La cartographie qui en résulte permet d’apprécier la concentration d’équipements dans un voisinage géographique proche.
# Création d'une grille de 1000 m
y <- create_grid(x = buf, res = 1000)
# Un équipement par ligne
osm$NB <- 1
# Calcul du potentiel
pot <- mcpotential(x = osm, y = y,
var = "NB", fun = "e",
span = 2500, beta = 2,
limit = 5000, ncl = 2)
y$pot <- pot
# Création d'isolignes
brks <- c(0, 1, 2, 4, 8, 16, 32, 64, 128, max(y$pot))
equipot <- equipotential(y, var = "pot", mask = country, breaks = brks)
# Cartographie
mf_map(buf, col = "lightblue")
mf_map(equipot, var = "center", type = "choro",
breaks = brks, border = NA, pal = "YlOrRd",
leg_title = "Équipement touristiques dans un voisinage 2500m", add = TRUE)
mf_map(osm, add = TRUE, pch = 20, col = "#ffffff80", cex = .6)
mf_map(cnrs, add = TRUE, pch = 17, cex = 2, col = "white")
mf_map(buf, col = NA, lwd = 2, add = TRUE) # Périmètre d'analyse
mf_layout(title = "Où concentrer ses visites ? ",
credits = paste0("Ecole Thématique SIG-R, RIATE, 2021\n",
"Source : Contributeurs OpenStreetMap, 2021"),
arrow = FALSE)C’est mieux à Aussois ? …
L’intérêt de la conception de la préparation des données et du programme d’analyse réside dans sa généricité. En pratique, il suffit de modifier le contenu de l’objet centre pour modifier l’espace d’étude de l’analyse.
centre <- "aussois"Synthèse sur les cinq centres
On peut aussi interroger les cinq couches géographiques disponibles par une boucle pour réaliser une table de synthèse.
# Créer un dataframe vide pour récupérer les données
df <- data.frame(
cnrs = character(),
pop = numeric(),
night = numeric(),
museum = integer (),
fort = integer(),
viewpoint = integer(),
artwork = integer(),
monument = integer(),
stringsAsFactors = FALSE)
df[1:5, "cnrs"] <- c("aussois", "frejus", "gerberal", "oleron", "plantiers")
# Bouche qui itère sur chaque centre du CNRS
for (i in 1:nrow(df)){
# Ouverture du geopackage + somme population rayon 30 km
com <- st_read(dsn = paste0("data/", df[i,"cnrs"], ".gpkg"), layer = "com", quiet = TRUE)
df[i, "pop"] <- sum(com$POP_2019, na.rm = TRUE)
# Ouverture de la grille + moyenne de la pollution lumineuse
grid <- st_read(dsn = paste0("data/", df[i,"cnrs"], ".gpkg"), layer = "grid", quiet = TRUE)
df[i, "night"] <- mean(grid$World_Atlas_2015, na.rm = TRUE)
# Ouverture de la couche point + dénombrement des équipements par catégorie
osm <- st_read(dsn = paste0("data/", df[i,"cnrs"], ".gpkg"), layer = "osm", quiet = TRUE)
tb <- table(osm$value)
df[i, "museum"] <- tb[4]
df[i, "fort"] <- tb[2]
df[i, "viewpoint"] <- tb[5]
df[i, "artwork"] <- tb[1]
df[i, "monument"] <- tb[3]
}
# Affichage des résultats
knitr::kable(df, row.names = F, digits = 2)| cnrs | pop | night | museum | fort | viewpoint | artwork | monument |
|---|---|---|---|---|---|---|---|
| aussois | 85795 | 0.13 | 87 | 1042 | 105 | 42 | 35 |
| frejus | 665723 | 0.54 | 566 | 28 | 160 | 72 | 59 |
| gerberal | 341381 | 0.21 | 247 | 29 | 335 | 79 | 108 |
| oleron | 304980 | 0.24 | 506 | 463 | 47 | 42 | 32 |
| plantiers | 143147 | 0.10 | 113 | 14 | NA | 30 | 48 |
Sources et préparation des données
Pour les personnes intéressées pour étendre l’espace d’analyse ou la reproduire à d’autres espaces, cette partie rappelle les sources mobilisées et présente le programme d’extraction des données consolidées mobilisées dans la séance.
Sources
Trois sources de données sont mobilisées pour cette mise en situation (table Markdown générée via Tables Generator) :
| Jeu de données | Description | Source |
|---|---|---|
| Découpage communal européen et population 2019 | Niveau LAU, version 2019 | Eurostat - GISCO |
| Intensité de pollution lumineuse en 2015 | Raster (résolution) 30 arc secondes qui exprime la radiance zénithale simulée. Données agrégées à l’année à partir du VIIRS Day Night Band |
Falchi, Fabio; Cinzano, Pierantonio; Duriscoe, Dan; Christopher C.M.; Elvidge, Christopher D.; Baugh, Kimberly; Portnov, Boris; Rybnikova, Nataliya A.; Furgoni, Riccardo (2016): Supplement to: The New World Atlas of Artificial Night Sky Brightness. V.1.1. GFZ Data Services |
| Points d’intérêt touristiques 2021 | Données extraites depuis le package osmdata avec les clés-valeurs OSM historic = fort,historic = monument, tourism = museum, tourism = viewpoint et tourism = artwork |
(c)OpenStreetMap et contributeurs, 2021 |
Préparation des données
Ce script présente les étapes successives de préparation des données consolidées utilisées ici. Nous souhaitons extraire les informations relatives aux trois bases de données ci-dessus dans un format vectoriel, dans un périmètre de 30 km autour de chaque centre de vacances CNRS. Cette étape présente l’avantage d’alléger considérablement la taille des fichiers sur lesquels reposent les analyses (le raster qui décrit la pollution lumineuse pesant près de 2.9 Go)
Le périmètre (buf = 30000) apparaît en début de chunk, et peut ainsi être modifié si l’on souhaite l’agrandir ou le réduire. Une boucle est créée pour extraire les données adéquates pour les six centres CNRS de l’objet cent.
GitHub n’étant pas approprié pour stocker de larges volumes de données, ces données sont accessibles ici si vous souhaiter reproduire cette phase de préparation des données à partir des données brutes.
library(sf)
library(raster)
library(osmdata)
library(rmapshaper)
# Perimètre d'analyse autour du centre
buf <- 30000
# Centres CNRS
cent <- read.csv(file = "data-raw/cnrs.csv")
# Géométries LAU et population
com <- st_read(dsn = "data-raw/LAU_RG_01M_2019_4326.shp", quiet = TRUE)
country <- aggregate(x = com[,"CNTR_CODE"], by = list(com$CNTR_CODE),
FUN = head, 1)
com <- st_transform(com, 2154)
country <- st_transform(country, 2154)
# Sélectionner la France et généraliser ses contours
fr <- country[country$CNTR_CODE == "FR",]
fr <- st_cast(fr, "POLYGON")
fr$id <- row.names(fr)
fr$area <- st_area(fr)
fr <- fr[order(fr$area, decreasing = TRUE),]
fr <- fr[1, "CNTR_CODE"]
fr <- ms_simplify(fr, keep = 0.05)
write_sf(obj = fr, dsn = paste0("data/fr.gpkg"),
delete_layer = TRUE, append = TRUE, layer = "fr")
# Pollution lumineuse
r <- raster("data-raw/World_Atlas_2015.tif")
# Boucle sur les 5 centres CNRS
for (i in 1: nrow(cent)){
# Extraction du centre et géoréferencement
cnrs <- cent[i,]
cnrs <- st_as_sf(cnrs, coords = c("longitude", "latitude"), crs = 4326)
cnrs <- st_transform(cnrs, 2154)
# Buffer
cnrsBuf <- st_buffer(cnrs, dist = buf)
# LAU pop + country
comBuf <- st_intersection(com, cnrsBuf)
comBuf <- comBuf[,c("GISCO_ID", "LAU_NAME", "POP_2019")]
countryBuf <- st_intersection(country, cnrsBuf)
# Raster pollution lumineuse
rBuf <- st_transform(cnrsBuf, projection(r)) # projection
rBuf <- intersect(r, rBuf) # intersection raster bbox r30k
dots <- st_as_sf(as(rBuf, 'SpatialPointsDataFrame')) # transformation vecteur
dots <- st_transform(dots, crs = 2154) # reprojection
grid <- st_make_grid(dots, cellsize = 1000, square = TRUE) # grille 1000m
grid <- aggregate(dots["World_Atlas_2015"], grid, mean) # agrégation valeurs (moy)
grid <- st_intersection(grid, cnrsBuf) # intersection grille buffer
# OSM (Zones d'intérêt touristique)
# Forts
bbox <- opq(st_bbox(st_transform(cnrsBuf, 4326))) # Emprise géo de recherche
# Création d'un dataframe cible
osm <- data.frame(matrix(ncol = 4, nrow = 0))
colnames(osm) <- c("osm_id", "key", "value")
# Exécuter une requête osm et l'associer au dataframe si elle contient 1 objet au min
osm_q <- function(x, key, value){
q <- add_osm_feature(opq = bbox, key = key, value = value)
q <- osmdata_sf(q)
q <- q$osm_points
if(nrow(q) > 0){
q$key <- key
q$value <- value
x <- rbind(x, q[,c("osm_id", "key", "value")])
}
if(nrow(q) == 0){
x <- x
}
return(x)
}
# 5 requêtes
osm <- osm_q(x = osm, key = "historic", value = "fort")
osm <- osm_q(x = osm, key = "historic", value = "monument")
osm <- osm_q(x = osm, key = "tourism", value = "museum")
osm <- osm_q(x = osm, key = "tourism", value = "viewpoint")
osm <- osm_q(x = osm, key = "tourism", value = "artwork")
osm <- st_transform(osm, 2154) # reprojection
osm <- st_intersection(osm, cnrsBuf)
# Export couches préparées
write_sf(obj = cnrs, dsn = paste0("data/", cent[i, "file"], ".gpkg"),
delete_layer = TRUE, append = TRUE, layer = "cnrs")
write_sf(obj = cnrsBuf, dsn = paste0("data/", cent[i, "file"], ".gpkg"),
delete_layer = TRUE, append = TRUE, layer = "cnrsBuf")
write_sf(obj = comBuf, dsn = paste0("data/", cent[i, "file"], ".gpkg"),
delete_layer = TRUE, append = TRUE, layer = "com")
write_sf(obj = countryBuf, dsn = paste0("data/", cent[i, "file"], ".gpkg"),
delete_layer = TRUE, append = TRUE, layer = "country")
write_sf(obj = grid, dsn = paste0("data/", cent[i, "file"], ".gpkg"),
delete_layer = TRUE, append = TRUE, layer = "grid")
write_sf(obj = osm, dsn = paste0("data/", cent[i, "file"], ".gpkg"),
delete_layer = TRUE, append = TRUE, layer = "osm")
} Session Info
sessioninfo::session_info()- Session info ---------------------------------------------------------------
setting value
version R version 4.0.5 (2021-03-31)
os Windows 10 x64
system x86_64, mingw32
ui RTerm
language (EN)
collate French_France.1252
ctype French_France.1252
tz Europe/Paris
date 2021-06-21
- Packages -------------------------------------------------------------------
package * version date lib source
bookdown 0.22 2021-04-22 [1] CRAN (R 4.0.5)
bslib 0.2.4 2021-01-25 [1] CRAN (R 4.0.5)
class 7.3-18 2021-01-24 [2] CRAN (R 4.0.5)
classInt 0.4-3 2020-04-07 [1] CRAN (R 4.0.5)
cli 2.5.0 2021-04-26 [1] CRAN (R 4.0.5)
crayon 1.4.1 2021-02-08 [1] CRAN (R 4.0.5)
DBI 1.1.1 2021-01-15 [1] CRAN (R 4.0.5)
digest 0.6.27 2020-10-24 [1] CRAN (R 4.0.5)
dplyr 1.0.6 2021-05-05 [1] CRAN (R 4.0.5)
e1071 1.7-6 2021-03-18 [1] CRAN (R 4.0.5)
ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.0.5)
evaluate 0.14 2019-05-28 [1] CRAN (R 4.0.5)
fansi 0.4.2 2021-01-15 [1] CRAN (R 4.0.5)
generics 0.1.0 2020-10-31 [1] CRAN (R 4.0.5)
glue 1.4.2 2020-08-27 [1] CRAN (R 4.0.5)
htmltools 0.5.1.1 2021-01-22 [1] CRAN (R 4.0.5)
isoband 0.2.4 2021-03-03 [1] CRAN (R 4.0.5)
jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.5)
jsonlite 1.7.2 2020-12-09 [1] CRAN (R 4.0.5)
KernSmooth 2.23-18 2020-10-29 [2] CRAN (R 4.0.5)
knitr * 1.33 2021-04-24 [1] CRAN (R 4.0.5)
lifecycle 1.0.0 2021-02-15 [1] CRAN (R 4.0.5)
magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.0.5)
mapsf * 0.2.0 2021-04-29 [1] CRAN (R 4.0.5)
pillar 1.6.0 2021-04-13 [1] CRAN (R 4.0.5)
pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.0.5)
potential * 0.1.0 2020-11-18 [1] CRAN (R 4.0.5)
proxy 0.4-25 2021-03-05 [1] CRAN (R 4.0.5)
purrr 0.3.4 2020-04-17 [1] CRAN (R 4.0.5)
R6 2.5.0 2020-10-28 [1] CRAN (R 4.0.5)
Rcpp 1.0.6 2021-01-15 [1] CRAN (R 4.0.5)
rlang 0.4.11 2021-04-30 [1] CRAN (R 4.0.5)
rmarkdown 2.8 2021-05-07 [1] CRAN (R 4.0.5)
rmdformats 1.0.2 2021-04-19 [1] CRAN (R 4.0.5)
sass 0.4.0 2021-05-12 [1] CRAN (R 4.0.5)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.0.5)
sf * 0.9-8 2021-03-17 [1] CRAN (R 4.0.5)
stringi 1.5.3 2020-09-09 [1] CRAN (R 4.0.3)
stringr 1.4.0 2019-02-10 [1] CRAN (R 4.0.5)
tibble 3.1.1 2021-04-18 [1] CRAN (R 4.0.5)
tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.0.5)
units 0.7-1 2021-03-16 [1] CRAN (R 4.0.5)
utf8 1.2.1 2021-03-12 [1] CRAN (R 4.0.5)
vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.0.5)
withr 2.4.2 2021-04-18 [1] CRAN (R 4.0.5)
xfun 0.22 2021-03-11 [1] CRAN (R 4.0.5)
yaml 2.2.1 2020-02-01 [1] CRAN (R 4.0.5)
[1] C:/Users/Ronan/Documents/R/win-library/4.0
[2] C:/Program Files/R/R-4.0.5/library